/**
 * 统一响应格式中间件
 * 自动为每个接口添加统一的响应格式：{ code, message, data }
 * data中包含分页信息和列表数据
 */
module.exports = () => {
  return async (ctx, next) => {
    try {
      await next()
      // 只处理成功的响应，错误响应由错误处理中间件处理
      if (ctx.status >= 200 && ctx.status < 300 && ctx.get('content-type') === 'application/json') {
        // 获取原始响应数据
        const originalBody = ctx.body
        // 构建标准响应格式
        const response = {
          code: 200,
          message: '操作成功',
          data: null
        }

        // 处理不同的响应数据类型
        if (originalBody && Array.isArray(originalBody)) {
          const total = originalBody.length
          const body = originalBody.splice(ctx.request.body.pageSize * (ctx.request.body.pageNum - 1), ctx.request.body.pageSize)
          // 如果原始响应是数组，包装为列表
          response.data = {
            list: body,
            total
          }
        }

        // 根据HTTP状态码设置消息
        switch (ctx.status) {
          case 201:
            response.message = '创建成功'
            break
          case 202:
            response.message = '请求已接受'
            break
          case 204:
            response.message = '操作成功，无返回内容'
            break
          default:
            response.message = '操作成功'
        }

        ctx.body = response
      }
    } catch (error) {
      // 继续抛出错误，由错误处理中间件处理
      throw error
    }
  }
}
